#include "GenCrack.h"
#include <time.h>



class MyGenerator : public TCombinatorio {
	private:
		FILE	*out;
		time_t	start, end;		
		char	tmpChar[3];

	public:
		MyGenerator(unsigned char *num, unsigned short num_comb) : TCombinatorio(num, num_comb, true)
		{
			out = NULL;
		}
		//
		// NUOVA COMBINAZIONE CALLBACK:		
		void callback_new_combination(const_lista combinazione, unsigned short len_array) {
			printf("\ncombinazione: %s", combinazione->Number);
		}

		// ----- CLEANER CALLBACK -----
		void callback_start_cleaner(void) 
		{
			printf("\nPulizia memoria...");
		}

		void callback_end_cleaner(void) 
		{
			printf("COMPLETATA\n");
		}
		
		// DISPOSIZIONI CON RIPETIZIONI CALLBACK:
		void callback_start_generate_with_equals(void) {
			time(&start);
			printf("\nElaborazione combinazioni con ripetizioni...\n");
		}

		void callback_end_generate_with_equals(__int64 total) {
			time(&end);
			printf("\nCOMPLETATO RIP\n\nTempo trascrorso: %.2fs\n", difftime(end, start));
		}

		void callback_voluntary_confirmed(const TSocketInfo *master) {
			printf("\nRichiesta di partecipazione accettata - master: %s:%d", master->ip, master->port);
		}

		void callback_abort_listner(void) {
			printf("\nRichiesta di chiusura elaborazione");
		}

		void callback_receive_work_unit(const TSocketInfo *master, const unsigned char *combinazione, unsigned short len_array) {
			printf("\nRicevuta nuova unita' lavorativa [%s] da master %s:%d", combinazione, master->ip, master->port);
		}

};



int main(void)
{
	unsigned char	perms[] = "";
	bool			ret = false;
	MyGenerator		comb(perms, 2);	

	ret = comb.SlaveListen("10.60.12.40", 5432);	// crea il server per lo slave	
	if (ret == false) {
		printf("\nError: %s", comb.GetLastErrorString());
		getchar();
		exit(EXIT_FAILURE);
	}
	comb.SendVoluntary("10.60.12.40", 54321);	 // invia richiesta di partecipazione ad un master (identificato da ip e porta)
	printf("Slave in ascolto:");
	getchar();
	comb.CloseSlaveListner(); // chiude il listner
	return (0);
}
